package com.qf.collection;


import java.util.ArrayList;
import java.util.Random;

/**
 * 1. 写一个学生类，类中有一个属性代表学生的好友列表（好友使用字符串即可）
 * (1) 提供一个方法，可以返回出两个学生对象的公共好友
 * (2) 提供一个方法，可以返回出两个学生对象的好友汇总
 */
public class StudentDemo {
    static class Student {
        private String name; // 学生姓名
        private ArrayList<String> friendsList = new ArrayList<String>(); // 朋友列表 10个

        public Student() {
        }

        public Student(String name, ArrayList<String> friendsList) {
            this.name = name;
            this.friendsList = friendsList;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public ArrayList<String> getFriendsList() {
            return friendsList;
        }


        public void setFriendsList(ArrayList<String> friendsList) {
            this.friendsList = friendsList;
        }

        /**
         * (1) 提供一个方法，可以返回出两个学生对象的公共好友
         * @param other 传入一个学生对象 Student类型
         * @return 返回一个String字符串,可以直接打印显示
         */
        public String publicFriends(Student other) {
            // 创建一个新的数组对象,初始值为 朋友数组对象内容 ArrayList<>(friendsList)
            ArrayList<String> newArr = new ArrayList<>(friendsList);
            newArr.retainAll(other.getFriendsList()); // 得到公共字符串

            return newArr.toString(); // 将公共朋友对象以字符串形式返回 [...]形式
        }

        /**
         * (2) 提供一个方法，可以返回出两个学生对象的好友汇总
         * @param other 传入一个学生对象 Student类型
         * @return 返回一个String字符串,可以直接打印
         */
        public String bothFriends(Student other) {

            // 创建一个新数组对象,初始值为 朋友数组对象内容 ArrayList<>(friendsList)
            ArrayList<String> arr = new ArrayList<>(friendsList);
            arr.addAll(other.getFriendsList()); // 和另一个朋友数组对象合并

            // 创建一个新数组对象,获取两个Student类的 朋友数组公共部分
            ArrayList<String> newArr = new ArrayList<>(friendsList);
            newArr.retainAll(other.getFriendsList());
            for (String s : newArr) { // 遍历公共部分数组,将上一个数组中重复的朋友去除
                arr.remove(s);
            }

            return arr.toString(); // 将得到的朋友合并数组以字符串形式返回 [...]形式
        }

        @Override
        public String toString() {
            return "name:"+getName()+" friends:"+getFriendsList().toString();
        }
    }

    public static void main(String[] args) {

        Student student01 = new Student();
        Student student02 = new Student();
        setFriends(student01); // 初始化赋值
        setFriends(student02);

        // (1) 提供一个方法，可以返回出两个学生对象的公共好友
        System.out.println(student01.publicFriends(student02));
        // (2) 提供一个方法，可以返回出两个学生对象的好友汇总
        System.out.println(student01.bothFriends(student02));

        System.out.println(student01);
        System.out.println(student02);
    }

    /**
     * 将传入的Student类进行初始化赋值
     * @param student 传入的是一个新建的无初始化Student对象
     */
    public static void setFriends(Student student) {
        ArrayList<String> friends = new ArrayList<String>();
        String[] students = {"李建男", "解嘉琪", "杨子桐", "吴天久", "王传硕", "潘彤", "邱洋", "李智", "陈洁莹", "赵小锐", "闫占影", "刘硕", "宋伟鹏", "李梓浚", "蔡政达", "裴嘉迎", "贾智程", "谭哲", "齐嘉衡", "张龙", "孙浩夕", "高畅", "宣守辉", "骆传龙", "马岩", "何洋", "刘剀钊", "韦嘉阳", "王椿润霆", "吴思键", "朱兴业", "刘俊博", "张宇航", "于永日", "常凯琪", "王海博", "张枭", "韩明", "霍佳欣", "万超岩", "李敬雨", "王葵", "谷龙"
        }; // 43人


        Random random = new Random();
        // 对Student对象里的 friend数组对象 进行赋值
        for (int i = 0; i < 10; i++) {
            int index = random.nextInt(43); // 通过随机数获取 Students 下标
            friends.add(students[index]); // 赋值
        }
        student.setFriendsList(friends);

        // 对Student对象里的 name属性(String类型) 进行赋值
        // 其中 name的值和 friends数组中的值不能相同
        while (true){
            int index = random.nextInt(43);
            if (!friends.contains(students[index])){
                student.setName(students[index]);
                return;
            }
        }

    }

}
